tests: Add a simple test to convert rendernode to png
authorBenjamin Otte <otte@redhat.com>
Wed, 21 Dec 2016 06:20:28 +0000 (07:20 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 23 Dec 2016 07:11:00 +0000 (08:11 +0100)
Takes a rendernode file, outputs a PNG. Nothing more.

tests/Makefile.am
tests/rendernode.c [new file with mode: 0644]

index 943329d88ce857e5dc980ed8c33bf817cb8c7e66..e6bff0a459c0c13301ca35e97c5c01ee9bcb2a53 100644 (file)
@@ -27,6 +27,7 @@ fontconfig_programs = testfontchooserdialog
 endif
 
 noinst_PROGRAMS =  $(TEST_PROGS)       \
+       rendernode                      \
        overlayscroll                   \
        syncscroll                      \
        animated-resizing               \
@@ -161,6 +162,7 @@ if USE_X11
 noinst_PROGRAMS += testerrors
 endif
 
+rendernode_DEPENDENCIES = $(TEST_DEPS)
 animated_resizing_DEPENDENCIES = $(TEST_DEPS)
 animated_revealing_DEPENDENCIES = $(TEST_DEPS)
 flicker_DEPENDENCIES = $(TEST_DEPS)
diff --git a/tests/rendernode.c b/tests/rendernode.c
new file mode 100644 (file)
index 0000000..70be90d
--- /dev/null
@@ -0,0 +1,68 @@
+#include <gtk/gtk.h>
+
+static GOptionEntry options[] = {
+  { NULL }
+};
+
+int
+main(int argc, char **argv)
+{
+  graphene_rect_t bounds;
+  cairo_surface_t *surface;
+  GskRenderNode *node;
+  cairo_t *cr;
+  GError *error = NULL;
+  GBytes *bytes;
+  char *contents;
+  gsize len;
+
+  if (!gtk_init_with_args (&argc, &argv, "NODE-FILE PNG-FILE",
+                           options, NULL, &error))
+    {
+      g_printerr ("Option parsing failed: %s\n", error->message);
+      return 1;
+    }
+
+  if (argc != 3)
+    {
+      g_printerr ("Usage: %s [OPTIONS] NODE-FILE PNG-FILE\n", argv[0]);
+      return 1;
+    }
+
+  if (!g_file_get_contents (argv[1], &contents, &len, &error))
+    {
+      g_printerr ("Could not open node file: %s\n", error->message);
+      return 1;
+    }
+
+  bytes = g_bytes_new_take (contents, len);
+  node = gsk_render_node_deserialize (bytes);
+  g_bytes_unref (bytes);
+
+  if (node == NULL)
+    {
+      g_printerr ("Invalid node file.\n");
+      return 1;
+    }
+
+  gsk_render_node_get_bounds (node, &bounds);
+  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, ceil (bounds.size.width), ceil (bounds.size.height));
+  cr = cairo_create (surface);
+
+  cairo_translate (cr, - bounds.origin.x, - bounds.origin.y);
+  gsk_render_node_draw (node, cr);
+
+  cairo_destroy (cr);
+  gsk_render_node_unref (node);
+
+  if (cairo_surface_write_to_png (surface, argv[2]))
+    {
+      cairo_surface_destroy (surface);
+      g_print ("Failed to save PNG file.\n");
+      return 1;
+    }
+
+  cairo_surface_destroy (surface);
+
+  return 0;
+}